package com.yonyou.train.algorithem;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * SHA加密
 */
public class SHA_Algorithm {
    private final static String KEY_SHA = "SHA";
    private final static String KEY_SHA1 = "SHA-1";
    private final static char hexDigists[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

    public SHA_Algorithm() {

    }

    public static byte[] encryptSHA(byte[] data) {
        if (data == null) {
            return null;
        }
        try {
            //创建具有指定算法名称的信息摘要
            MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
            //使用指定的字节数组对摘要进行最后的更新
            sha.update(data);
            //完成摘要信息并且返回
            return sha.digest();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        return data;
    }

    /**
     * 我们在web开发中，经常要保证密码的安全性，那么怎么对密码进行处理呢？首先得进行秘密加密吧！下面是提供的SHA加密方式
     * <p>
     * SHA（secure hash algorithm,译作安全散列算法）是美国国家安全局设计，美国国家标准与技术研究院发布的一系列密码散列函数。正式
     * 名称为SHA的家族第一个成员发布于1993年。然而人们给他取了一个非正式的名称SHA-0以避免与它的后继者混淆。两年之后，SHA-1，第一个
     * SHA的后继者发布了。另外还有四种变体，曾经发布以提升输出的范围和变更一些细微设计：。。。
     */
//SHA加密算法
    public static String encryptSHA(String data) {
        //验证传入的字符串
        if (data == null || data.equals("")) {
            return "";
        }

        try {
            //创建具有指定算法名称的信息摘要
            MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
            //使用指定的字节数组对摘要进行最后的更新
            sha.update(data.getBytes());
            //完成摘要计算
            byte[] bytes = sha.digest();
            //将得到的字节数组变成字符串返回
            return byteArrayToHexString(bytes);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }


        return null;
    }

    /**
     * 将一个字节转换成十六进制形式的字符串
     */
    private static String byteToHexString(byte b) {
        int ret = b;
        if (ret < 0) {
            ret += 256;

        }
        int m = ret / 16;
        int n = ret % 16;

        return "" + hexDigists[m] + hexDigists[n];
    }

    private static String byteArrayToHexString(byte[] bytes) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < bytes.length; i++) {
            sb.append(byteToHexString(bytes[i]));
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        String s = "Yan230Kd";
        String ss = SHA_Algorithm.encryptSHA(s);
        System.out.println(ss);
    }
}













